// 导入 axios 模块
import axios from 'axios'
import store from '@/store'
import router from '@/router'
// 导入 Message 消息提示函数
import { Message } from 'element-ui'

// 创建 axios 实例
const service = axios.create({
  // 配置请求基地址,自己的本地地址可以省略不写
  // baseURL: '' + process.env.VUE_APP_BASE_API,
  baseURL: process.env.VUE_APP_BASE_API,
  // 请求超时时间
  timeout: 5000
})

// 添加拦截器
// 添加请求拦截器
service.interceptors.request.use(
  // config中包含请求的所有信息
  config => {
    // 从vuex中获取token
    const { token } = store.state.user
    if (token) {
      // 如果有token,通过请求头携带给后台，给headers添加Authorization属性
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  err => Promise.reject(err)
)

// 添加响应拦截器
service.interceptors.response.use(
  resp => {
    // 结构data
    const { data } = resp
    // 判断 data.success
    if (data.success) {
      // 请求成功
      // 直接返回data的数据
      return data // 接口调用处返回,==data-->resp
    }
    // 请求失败，返回一个失败态的Promise实例
    return Promise.reject(data) // 失败态返回给catch里面的err，data--err
  },
  // 响应拦截器的失败回调：公共处理
  async err => {
    // 判断token过期状态码
    if (err.response.status === 401 && err.response.data.code === 10002) {
      // 给出token过期提示
      Message.error({
        type: true,
        message: '登录过期，请重新登录！'
      })
      // 清空vuex中的token和用户信息
      await store.dispatch('user/logoutAction')
      // 跳转至登录，并携带回跳地址
      router.reolace(`/login?redirectUrl=${router.currentRoute.fullPath}`)
    }
    // 返回一个失败状态的Promise实例
    return Promise.reject(err)
  }
)

// 导出请求实例
export default service

// 基地址不同，可以创建多个axios 实例，分别编写拦截器
// const service2 = axios.create({
//   // 配置请求基地址
//   baseURL: 'http://def.ihrm.itheima.net/api',
//   // 请求超时时间
//   timeout: 5000
// })
// 多个按需导出
// export { service1, service2 }
